package org.fixies.spreadsheet.interpreter;

import org.fixies.spreadsheet.Section;
import org.fixies.spreadsheet.Sheet;


import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


/**
 * シートノード
 *
 * @author Kawasaki
 */
public class SheetNode {

    private String bookName_;

    /**
     * シート名
     */
    private String sheetName_;

    /**
     * セクション
     * シートの上から出現順に格納する為、実装はLinkedHashMap
     */
    private Map<String, Section> sections_ = new LinkedHashMap<String, Section>();



    private List<SectionNode> sectionNodes_ = new ArrayList<SectionNode>();

    private String origin_;

    /**
     * コンストラクタ
     * @param bookName ブック名
     * @param sheetName シート名
     */
    public SheetNode(String bookName, String sheetName) {
        bookName_ = bookName;
        sheetName_ = sheetName;
        origin_ = "Book=[" + bookName + "], Sheet=[" + sheetName + "]";
    }



    /**
     * 評価する。
     *
     * @param context コンテクスト
     */
    public void evaluate(SheetContext context) {
        String[] line = context.currentSkippingEmptyRow();
        while (line != null) {
            SectionNode sectionNode = new SectionNode(origin_);
            sectionNode.evaluate(context);
            sectionNodes_.add(sectionNode);
            line = context.nextSkippingEmptyRow();
        }
    }



    /**
     * 解析結果を取得する。
     *
     * @return 解析結果
     */
    public Sheet getResult() {
        for (SectionNode sectionNode : sectionNodes_) {
            Section section = sectionNode.getResult();
            sections_.put(section.getId(), section);
        }
        return createSheet(bookName_, sheetName_, sections_);

    }

    protected Sheet createSheet(String bookName, String sheetName,
                                Map<String, Section> sections) {
        return new Sheet(bookName, sheetName, sections);
    }

    public String getSheetName() {
        return sheetName_;
    }

}
